package com.行为型模型.U访问者模式;

/**
 * 1，优点：
 * 	扩展性好 在不修改对象结构中的元素的情况下，为对象结构中的元素添加新的功能。
 * 	复用性好 通过访问者来定义整个对象结构通用的功能，从而提高复用程度。
 * 	分离无关行为 通过访问者来分离无关的行为，把相关的行为封装在一起，构成一个访问者，这样每一个访问者的 功能都比较单一。
 * 2，缺点：
 * 	对象结构变化很困难 在访问者模式中，每增加一个新的元素类，都要在每一个具体访问者类中增加相应的具体操作，这 违背了“开闭原则”。 违反了依赖倒置原则 访问者模式依赖了具体类，而没有依赖抽象类。
 *
 * 使用场景
 * 	对象结构相对稳定，但其操作算法经常变化的程序。 对象结构中的对象需要提供多种不同且不相关的操作，而且要避免让这些操作的变化影响对象的结 构。
 *
 * 扩展
 * 	访问者模式用到了一种双分派的技术。
 * 	1，分派：
 * 		变量被声明时的类型叫做变量的静态类型，有些人又把静态类型叫做明显类型；而变量所引用的对象的 真实类型又叫做变量的实际类型。比如 Map map = new HashMap() ，map变量的静态类型是 Map ，实际类型是 HashMap 。根据对象的类型而对方法进行的选择，就是分派(Dispatch)，分派 (Dispatch)又分为两种，即静态分派和动态分派。
 * 		静态分派(Static Dispatch)
 * 			发生在编译时期，分派根据静态类型信息发生。静态分派对于我们来 说并不陌生，方法重载就是静态分派。
 * 		动态分派(Dynamic Dispatch)
 * 			发生在运行时期，动态分派动态地置换掉某个方法。Java通过方法 的重写支持动态分派。
 */
public class Test {
    public static void main(String[] args) {
        Home home=new Home();
        Person owner=new Owner();
        Person someone=new Someone();

        Animal dog=new Dog();
        Animal cat=new Cat();

        home.add(dog);
        home.add(cat);

        home.action(owner);
        home.action(someone);


    }
}
